Skip to content

feat!: include init_hash in private initialization nullifier (backport #21427)#21736

Merged
nchamo merged 4 commits intobackport-to-v4-next-stagingfrom
claudebox/da2e780cdbdce797-2
Mar 18, 2026
Merged

feat!: include init_hash in private initialization nullifier (backport #21427)#21736
nchamo merged 4 commits intobackport-to-v4-next-stagingfrom
claudebox/da2e780cdbdce797-2

Conversation

@AztecBot
Copy link
Collaborator

Summary

Backport of #21427 to v4-next.

The private initialization nullifier was computed as just address.to_field(). Anyone who knows a contract's address can compute this nullifier and check for its existence in the nullifier tree, revealing whether the contract has been initialized. This is a privacy leak for fully private contracts.

The private initialization nullifier is now computed as poseidon2_hash(address, init_hash) with a dedicated domain separator (DOM_SEP__PRIVATE_INITIALIZATION_NULLIFIER). Since init_hash is not publicly available for fully private contracts, address knowledge alone is no longer sufficient to determine initialization status.

Cherry-pick conflicts resolved

  • migration_notes.md: Kept only the init_hash migration note, dropped unrelated next-only notes (epochNumber, L2ToL1 witness)
  • deployment_proofs.nr: Added new assert_contract_was_initialized_by_with_wrong_init_hash_fails test, updated error message for non-inclusion test
  • constants_tests.nr: Added DOM_SEP__PRIVATE_INITIALIZATION_NULLIFIER import, updated tester size from <51, 44> to <51, 45> (excluded DOM_SEP__SINGLE_USE_CLAIM_NULLIFIER which doesn't exist on v4-next)
  • private_execution.test.ts: Merged imports from both sides (kept v4-next's AppendOnlyTreeSnapshot, PartialStateReference, StateReference + added PR's randomContractInstanceWithAddress, MerkleTreeId, NativeWorldStateService)

ClaudeBox log: https://claudebox.work/s/da2e780cdbdce797?run=2

@AztecBot AztecBot added ci-draft Run CI on draft PRs. claudebox Owned by claudebox. it can push to this PR. labels Mar 18, 2026
@AztecBot AztecBot force-pushed the claudebox/da2e780cdbdce797-2 branch from b854e84 to f55ecc8 Compare March 18, 2026 13:33
nchamo and others added 2 commits March 18, 2026 13:46
…fier (PR #21427)

Cherry-pick of merge commit 1c9652a with conflicts.
Resolved conflicts in:
- migration_notes.md: kept only init_hash migration note
- constants_tests.nr: added DOM_SEP__PRIVATE_INITIALIZATION_NULLIFIER import, tester size <51, 45>
- private_execution.test.ts: merged imports from both sides
@AztecBot AztecBot force-pushed the claudebox/da2e780cdbdce797-2 branch from f55ecc8 to 6c9db81 Compare March 18, 2026 13:47
@nchamo nchamo marked this pull request as ready for review March 18, 2026 14:10
@nchamo nchamo enabled auto-merge (squash) March 18, 2026 14:29
@AztecBot
Copy link
Collaborator Author

Flakey Tests

🤖 says: This CI run detected 2 tests that failed, but were tolerated due to a .test_patterns.yml entry.

\033FLAKED\033 (8;;http://ci.aztec-labs.com/1fb23cf677c51593�1fb23cf677c515938;;�):  yarn-project/end-to-end/scripts/run_test.sh simple src/e2e_epochs/epochs_invalidate_block.parallel.test.ts "proposer invalidates previous block with shuffled attestations" (124s) (code: 0) group:e2e-p2p-epoch-flakes
\033FLAKED\033 (8;;http://ci.aztec-labs.com/63ba804a11fa2e39�63ba804a11fa2e398;;�):  yarn-project/end-to-end/scripts/run_test.sh simple src/e2e_p2p/duplicate_proposal_slash.test.ts (279s) (code: 0) group:e2e-p2p-epoch-flakes

@nchamo nchamo merged commit db2bdce into backport-to-v4-next-staging Mar 18, 2026
9 checks passed
@nchamo nchamo deleted the claudebox/da2e780cdbdce797-2 branch March 18, 2026 14:53
AztecBot added a commit that referenced this pull request Mar 19, 2026
BEGIN_COMMIT_OVERRIDE
feat: entrypoint replay protection (#21649)
feat: guard BoundedVec oracle returns against dirty trailing storage
(#21589)
fix: add bounds when allocating arrays in deserialization (#21622)
feat: implement manual Packable for structs with sub-Field members
(#21576)
fix(aztec-node): throw on existing nullifier in
getLowNullifierMembershipWitness (#21472)
fix: use trait dispatch for array Packable::unpack in card_game_contract
(#21683)
fix(p2p): penalize peers for errors during response reading (#21680)
fix: update nullifier non-inclusion test expectations after early oracle
throw (backport #21600) (#21615)
fix(aztec-nr): fix OOB index with nonzero offset (#21613)
fix(builder): persist contractsDB across blocks within a checkpoint
(#21520)
fix(stdlib): accept null return_type for void Noir functions (#21647)
feat: gas estimations on send (#21646)
fix(validator): process block proposals from own validator keys in HA
setups (backport #21603) (#21659)
fix(p2p): penalize peer on tx rejected by pool (#21677)
fix(sequencer): fix checkpoint budget redistribution for multi-block
slots (#21692)
feat: sync cache invalidation oracle (backport #21459) (#21730)
feat!: make AES128 decrypt oracle return Option (backport #21696)
(#21735)
feat!: include init_hash in private initialization nullifier (backport
#21427) (#21736)
fix(sequencer): extract gas and blob configs from valid requests only
(A-677) (#21747)
chore: backport #21744 — replace dead BOOTSTRAP_TO env var with
bootstrap.sh build arg (#21748)
refactor: revert remove assert_bounded_vec_trimmed (#21758)
END_COMMIT_OVERRIDE
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ci-draft Run CI on draft PRs. claudebox Owned by claudebox. it can push to this PR.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants